﻿Public Class Clientes
    Enum estado
        modificar
        insertar
        consultar
    End Enum

    Dim proximoId As Integer
    Dim datos As AccesoADatos
    Dim carga As ManejoDeCarga
    Dim editar As estado
    Dim id_cliente As Integer

    Private Sub Clientes_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        datos = New AccesoADatos()
        carga = New ManejoDeCarga()
        carga.cargarCombo(cmb_localidad, "Localidad", "id_localidad", "nombre")
        carga.cargarCombo(cmb_tipoDocumento, "Tipo_Documento", "id_tipodoc", "descripcion")
        carga.cargarCombo(cmb_buscarTipoDocumento, "Tipo_Documento", "id_tipodoc", "descripcion")
        carga_grilla("")
        modo(estado.consultar)
        ToolTip1.SetToolTip(Me.btn_nuevo, "Crear un nuevo registro")
        ToolTip1.SetToolTip(Me.btn_modificar, "Modificar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_eliminar, "Eliminar el registro seleccionado")
        ToolTip1.SetToolTip(Me.btn_buscar, "Realizar búsqueda")
        ToolTip1.SetToolTip(Me.btn_cancelar, "Cancelar la operación actual")
        ToolTip1.SetToolTip(Me.btn_guardar, "Guardar los datos cargados")
        ToolTip1.SetToolTip(Me.btn_salir, "Salir del formulario")
    End Sub

    Private Sub carga_grilla(ByRef where As String)
        If where = "" Then
            carga.cargarGrilla(grd_clientesActuales, "apellido+', '+nombre AS Nombre, num_doc AS 'Nº Documento', descripcion AS 'Tipo de documento', id_cliente", _
                               "Cliente c JOIN Tipo_Documento t ON c.id_tipodoc = t.id_tipodoc")
        Else
            carga.cargarGrilla(grd_clientesActuales, "c.apellido+ ', ' +c.nombre AS 'Nombre', c.num_doc AS 'Nº Documento', t.descripcion AS 'Tipo de documento', c.id_cliente", _
                               "Cliente c JOIN Tipo_Documento t ON c.id_tipodoc = t.id_tipodoc", where)
        End If
        grd_clientesActuales.Columns(3).Visible = False
    End Sub

    Private Sub modo(ByRef e As estado)
        editar = e
        Select Case e
            Case estado.consultar
                pnl_busqueda.Enabled = True
                pnl_controlesCarga.Enabled = True
                pnl_controlesConfirmacion.Enabled = False
                pnl_carga.Enabled = False
                btn_guardar.Enabled = False
                cmb_tipoDocumento.SelectedIndex = -1
                cmb_localidad.SelectedIndex = -1
                cmb_barrio.SelectedIndex = -1
                Exit Select
            Case estado.insertar
                pnl_busqueda.Enabled = False
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                pnl_carga.Enabled = True
                btn_guardar.Enabled = True
                cmb_tipoDocumento.SelectedIndex = -1
                cmb_localidad.SelectedIndex = -1
                cmb_barrio.SelectedIndex = -1
                Exit Select
            Case estado.modificar
                pnl_busqueda.Enabled = False
                Me.dtp_fechaNac.Enabled = True
                pnl_controlesCarga.Enabled = False
                pnl_controlesConfirmacion.Enabled = True
                pnl_carga.Enabled = True
                btn_guardar.Enabled = True
                Exit Select
        End Select
    End Sub

    Private Sub btn_nuevo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_nuevo.Click
        Me.calcular_proximo_id()
        Me.modo(estado.insertar)
        Me.dtp_fechaNac.Enabled = True
        Me.txt_nombre.Text = ""
        Me.txt_nombre.Focus()
    End Sub

    Private Sub calcular_proximo_id()
        Dim tabla As New Data.DataTable
        tabla = datos.leerTabla("MAX(id_cliente)", "Cliente")
        proximoId = tabla.Rows(0)(0) + 1
    End Sub

    Private Sub btn_modificar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_modificar.Click
        modo(estado.modificar)
        Dim pk As Integer = Me.grd_clientesActuales.CurrentRow.Cells(3).Value
        Dim dt As New Data.DataTable
        dt = datos.leerTabla("*", "Cliente", "id_cliente = " & pk)
        Me.txt_nombre.Text = dt.Rows(0)("nombre")
        Me.txt_apellido.Text = dt.Rows(0)("apellido")
        Me.cmb_tipoDocumento.SelectedValue = dt.Rows(0)("id_tipodoc")
        Me.txt_numeroDocumento.Text = dt.Rows(0)("num_doc")
        Me.dtp_fechaNac.Value = dt.Rows(0)("fecha_nac")
        Me.txt_calle.Text = dt.Rows(0)("calle")
        Me.txt_numero.Text = dt.Rows(0)("numero")
        Me.cmb_localidad.SelectedValue = datos.leerTabla("id_localidad", "Barrio", "id_barrio = " & dt.Rows(0)("id_barrio")).Rows(0)("id_localidad")
        Me.cmb_barrio.SelectedValue = dt.Rows(0)("id_barrio")
        Me.txt_telefono.Text = dt.Rows(0)("num_tel")
        Me.txt_email.Text = dt.Rows(0)("email")
        Me.txtpk.Text = pk
    End Sub

    Private Sub btn_Eliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_eliminar.Click
        If MessageBox.Show("¿Esta seguro que desea borrar el cliente seleccionado?", "Importante", _
                                            MessageBoxButtons.YesNo, MessageBoxIcon.Warning) = Windows.Forms.DialogResult.Yes Then
            datos.borrarRegistro("Cliente", "id_cliente", Me.grd_clientesActuales.CurrentRow.Cells(3).Value)
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub limpiar_campos()
        txt_nombre.Clear()
        txt_apellido.Clear()
        cmb_tipoDocumento.SelectedIndex = -1
        txt_numeroDocumento.Clear()
        txt_telefono.Clear()
        txt_calle.Clear()
        txt_numero.Clear()
        cmb_buscarTipoDocumento.SelectedIndex = -1
        cmb_localidad.SelectedIndex = -1
        cmb_barrio.SelectedIndex = -1
        txt_buscarNumeroDocumento.Clear()
        txt_email.Clear()
        carga_grilla("")
    End Sub

    Private Sub btn_cancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_cancelar.Click
        Dim mensaje As String = "¿Esta seguro que desea cancelar la operación actual?"
        If editar = estado.consultar Then
            mensaje = "¿Cancelar la búsqueda?"
        End If
        If MessageBox.Show(mensaje, "Confirmación", MessageBoxButtons.YesNo, _
                    MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            modo(estado.consultar)
            limpiar_campos()
        End If
    End Sub

    Private Sub btn_guardar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_guardar.Click
        If validar_carga() Then
            If editar = estado.insertar Then
                If insertar_cliente() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    proximoId += 1
                    MessageBox.Show("Cliente agregado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            Else
                If modificar_cliente() Then
                    modo(estado.consultar)
                    limpiar_campos()
                    MessageBox.Show("Cliente modificado correctamente", "Operación exitosa", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End If
            End If
        End If
    End Sub

    Private Function validar_carga() As Boolean
        If validar_vacios() Then
            If validar_contenido() Then
                Return True
            End If
        End If
        Return False
    End Function

    Private Function validar_existencia() As Boolean
        If datos.leerTabla("*", "Cliente", "id_tipodoc= " & cmb_tipoDocumento.SelectedValue & " AND num_doc = " & txt_numeroDocumento.Text).Rows.Count() <> 0 Then
            MessageBox.Show("Ya existe un cliente con el número y tipo de documento indicados", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function validar_vacios() As Boolean
        Dim validacion As Boolean = True
        If txt_nombre.Text = "" Or txt_apellido.Text = "" Or cmb_tipoDocumento.SelectedIndex = -1 _
            Or txt_numeroDocumento.Text = "" Or txt_telefono.Text = "" Or txt_calle.Text = "" _
            Or txt_numero.Text = "" Or cmb_localidad.SelectedIndex = -1 Or cmb_barrio.SelectedIndex = -1 _
            Or txt_email.Text = "" Then
            MessageBox.Show("Debe completar todos los campos", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            validacion = False
        End If
        Return validacion
    End Function

    Private Function validar_contenido() As Boolean
        Try
            Integer.Parse(txt_numeroDocumento.Text)
        Catch ex As FormatException
            MessageBox.Show("El documento debe ser un valor numérico", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        Catch ex As OverflowException
            MessageBox.Show("El documento ingresado es muy grande!", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End Try
        If txt_numeroDocumento.Text.Length < 7 Or txt_numeroDocumento.Text.Length > 8 Then
            MessageBox.Show("El documento debe tener 7 u 8 dígitos", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Try
            Long.Parse(txt_numero.Text)
        Catch ex As FormatException
            MessageBox.Show("El número de la dirección debe ser un valor numérico", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        Catch ex As OverflowException
            MessageBox.Show("La dirección ingresada es muy grande", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End Try
        If txt_numero.Text.Length > 5 Then
            MessageBox.Show("El número de la dirección no debe ser mayor a 5 dígitos", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Return False
        End If
        Return True
    End Function

    Private Function insertar_cliente() As Boolean
        Dim exito As Boolean = True
        If validar_existencia() Then
            Dim valores As String = proximoId & ", " & cmb_tipoDocumento.SelectedValue & ", " & txt_numeroDocumento.Text & ", '"
            valores &= txt_apellido.Text & "', '" & txt_nombre.Text & "', '" & dtp_fechaNac.Text & "', '" & txt_calle.Text & "', " & txt_numero.Text & ", "
            valores &= cmb_barrio.SelectedValue & ", '" & txt_email.Text & "', " & txt_telefono.Text
            Try
                datos.insertarRegistro("Cliente", valores)
            Catch ex As OleDb.OleDbException
                exito = False
                MessageBox.Show("Error cargando al cliente en la base de datos", "Cliente no agregado", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try
        Else
            exito = False
        End If
        Return exito
    End Function

    Private Function modificar_cliente() As Boolean
        Dim exito As Boolean = True
        Dim valores As String
        valores = "id_tipodoc = " & Me.cmb_tipoDocumento.SelectedValue
        valores &= ", num_doc = " & Me.txt_numeroDocumento.Text
        valores &= ", apellido = '" & Me.txt_apellido.Text & "'"
        valores &= ", nombre = '" & Me.txt_nombre.Text & "'"
        valores &= ", fecha_nac = '" & Me.dtp_fechaNac.Value & "'"
        valores &= ", calle = '" & Me.txt_calle.Text & "'"
        valores &= ", numero = " & Me.txt_numero.Text
        valores &= ", id_barrio = " & Me.cmb_barrio.SelectedValue
        valores &= ", email = '" & Me.txt_email.Text & "'"
        valores &= ", num_tel = " & Me.txt_telefono.Text

        Try
            datos.modificarRegistro("Cliente", valores, "id_cliente", txtpk.Text)
        Catch ex As OleDb.OleDbException
            exito = False
            MessageBox.Show("Debe completar los campos correctamente", "Cliente no modificado", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End Try
        Return exito
    End Function
    Private Sub carga_combo(ByRef combo As ComboBox, ByRef tabla As Data.DataTable, ByVal pk As String, ByVal nombre As String)
        combo.DataSource = tabla
        combo.ValueMember = pk
        combo.DisplayMember = nombre
        combo.SelectedIndex = -1
    End Sub

    Private Function cargo_barrios(ByVal loc As String) As Data.DataTable
        Dim conexion As New Data.OleDb.OleDbConnection
        Dim command As New Data.OleDb.OleDbCommand
        Dim tabla As New Data.DataTable
        Dim consulta As String = ""

        conexion.ConnectionString = datos._StrConexion
        conexion.Open()

        consulta = "select b.id_barrio, b.nombre from barrio b INNER JOIN localidad l ON b.id_localidad = l.id_localidad WHERE l.nombre = '" & loc & "' "

        command.CommandType = CommandType.Text
        command.CommandText = consulta
        command.Connection = conexion

        tabla.Load(command.ExecuteReader())
        carga_combo(Me.cmb_barrio, tabla, "id_barrio", "nombre")

        conexion.Close()
        Return tabla

    End Function
    Private Sub btn_buscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_buscar.Click
        If validar_campos_de_busqueda() Then
            Dim where As String = "c.num_doc =" & Me.txt_buscarNumeroDocumento.Text & " and c.id_tipodoc= " & Me.cmb_buscarTipoDocumento.SelectedValue
            Try
                carga_grilla(where)
                pnl_controlesConfirmacion.Enabled = True
                btn_guardar.Enabled = False
            Catch ex As OleDb.OleDbException
                MessageBox.Show("Debe completar los campos correctamente", "Error de búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
                limpiar_campos()
            End Try
        Else
            MessageBox.Show("Debe completar todos los campos", "Error en la búsqueda", MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If
    End Sub

    Private Function validar_campos_de_busqueda() As Boolean
        Dim validacion As Boolean = True
        If txt_buscarNumeroDocumento.Text = "" Or cmb_buscarTipoDocumento.SelectedIndex = -1 Then
            validacion = False
        End If
        Return validacion
    End Function

    Private Sub btn_salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_salir.Click
        If System.Windows.Forms.DialogResult.OK = MessageBox.Show("Cerrar esta ventana?", "Importante", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) Then
            Me.Close()
        End If
    End Sub

    Private Sub cmb_localidad_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmb_localidad.SelectedIndexChanged
        Me.cargo_barrios(Me.cmb_localidad.Text)
    End Sub

End Class
